package com.szh.zx.java8.day2;


import com.szh.zx.java8.POJO.Employee;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * 流的中间操作
 */
public class TestStreamAPI2 {
	/*
	 * 中间操作：
	 * 筛选与切片
	 * filter-接受Lambda ，从流中排除某些元素
	 * limit-截断流，使其元素不超过给定元素
	 * skip-跳过元素，返回一个丢掉前n个元素的不足n个
	 * distinct-筛选
	 *
	 * */
	List<Employee> employees = Arrays.asList(
			new Employee("张三1", 12, 2222),
			new Employee("张三2", 12, 2222),
			new Employee("张三3", 40, 2222),
			new Employee("张三4", 12, 22222),
			new Employee("张三5", 12, 2222)
	);

	public void test1() {
		Stream<Employee> stream = employees.stream()
				//中间操作
				.filter((e) -> e.getAge() > 32);
		// 终止操作
		stream.forEach(System.out::println);
	}

	
	public void test2() {
		employees.stream()
				.filter((e) -> {
					System.out.println("短路"); // 只迭代两次。要2个，就迭代俩次
					return e.getSalary() > 200;

				}).limit(2)
				.forEach(System.out::println);

	}
	
	public void test4(){
		employees.stream()
				.filter((e)->e.getSalary()>2)
				.skip(2) // 跳过2个结果
				.forEach(System.out::println);

	}
	// 映射操作
	
	public void test5(){
		List<String> list = Arrays.asList("aaa","bb","cc","dddd");
		list.stream()
				.map((str)->str.toUpperCase())
				.forEach(System.out::println);

		System.out.println("------------");
		employees.stream()
				.map(Employee::getName)
				.forEach(System.out::println);
		System.out.println("------------");
		// todo 注意体会
		Stream<Stream<Character>> streamStream = list.stream().map(TestStreamAPI2::filterCharacter);
		streamStream.forEach((sm)->{
			sm.forEach(System.out::println);
		});
		System.out.println("------------");

	}

	/**
	 * 找到以字母"J"开头，然后转成大写
	 * */
	
	public void test6(){
		/*List<String> sourceList = Arrays.asList("Java", "JavaScript", "python", "PHP", "C#", "Golang", "Swift");*/
		// java8之前
		/*List<String> filterList = new ArrayList<>();
		for (String str : sourceList) {
			if (str.startsWith("J")) {
				filterList.add(str.toUpperCase());
			}
		}
		for (String str : filterList) {
			System.out.println(str);
		}*/

		// 使用 java Stream
		// 筛选满足，以字母“J”开头的元素
		/*sourceList.stream()
				.filter(s-> s.startsWith("J"))
				.map(String :: toUpperCase)
				.forEach(System.out :: println);*/

		List<Integer> integerList = Arrays.asList(1, 2, 4, 5, 6, 6, 4, 2);
		// 一个入参的
		integerList.stream()
				.reduce(Integer::max)
				.ifPresent(System.out::println);
		integerList.stream()
				.reduce(Integer::min)
				.ifPresent(System.out::println);
		// 二个个入参的
		Integer sum = integerList.stream()
				.filter(i -> (i % 2 == 0))
				.reduce(0, Integer::sum);
		System.out.println(sum);
		// 三个入参的
		// 前两个灵活性不足，元素是什么类型的，输出也是什么类型的。比如：元素是int，累加之后int放不下，需要Long类型。下面这个就可以。
		// 当然不局限这个
		String string = integerList.stream()
				.reduce(0L, Long::sum, (a, b) -> 0L)
				.toString();
		System.out.println(string);


	}
	public static Stream<Character> filterCharacter(String str){
		List<Character> list = new ArrayList<>();
		for (Character ch : str.toCharArray()) {
			list.add(ch);
		}
		return list.stream();
	}

	
	public void test7(){


		List<String> sourceList = Arrays.asList("Java", "JavaScript", "python", "PHP", "C#", "Golang", "Swift");
		//满足长度小于4，元素有 "PHP", "C#"
		


//		System.out.println(words);
	}
}
